# -*- coding:utf-8 -*-

operators = {  # 运算符操作
   '+': lambda op1, op2: op1 + op2,
   '-': lambda op1, op2: op1 - op2,
   '*': lambda op1, op2: op1 * op2,
   '/': lambda op1, op2: op1 / op2,
}


def evalPostfix(e):
   """
   :param e: 后缀表达式
   :return: 正常情况下栈内的第一个元素就是计算好之后的值
   """
   tokens = e.split()  # 把传过来的后缀表达式切分成列表
   stack = []
   for token in tokens:  # 迭代列表中的元素
      if token.isdigit():  # 如果当前元素是数字
         stack.append(int(token))  # 就追加到栈里边
      elif token in operators.keys():  # 如果当前元素是操作符
         f = operators[token]  # 获取运算符操作表中对应的lambda表达式
         op2 = stack.pop()  # 根据先进后出的原则，先让第二个元素出栈
         op1 = stack.pop()  # 在让第一个元素出栈
         stack.append(f(op1, op2))  # 把计算的结果在放入到栈内
   return stack.pop()  # 返回栈内的第一个元素


result = evalPostfix('2 3 4 * +')
print(result)
# 14
